package example;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Created by IntelliJ IDEA.
 * User: stermi
 * Date: 29-nov-2009
 * Time: 11.30.18
 * To change this template use File | Settings | File Templates.
 */
public class Persona {

	public static final String tabName = "persona";

    public static final String idField = "id";
    
    public static final String nomeField = "nome";
    public static final String cognomeField = "cognome";
    public static final String dataNascitaField = "data_nascita";
    public static final String luogoNascitaField = "luogo_nascita";
    public static final String biografiaField = "biografia";
    public static final String awardsField = "awards";
	
    public int id;
    
    public String nome;
    public String cognome;
    public Date dataNascita;
    public String luogoNascita;
    public String biografia;
    public String awards;

    public Persona( ) {
    	this.id = -1;
    }
    
    public Result validate() {
    	Result result = new Result( true, null, "" );
    	
    	if ( nome.trim().equals("") ) {
    		result.result = false;
    		result.errorMessage += "Il nome non puo' essere vuoto\n";
    	}
    	
    	if ( cognome.trim().equals("") ) { 
    		result.result = false;
    		result.errorMessage += "Il cognome non puo' essere vuoto\n";
    	}
    	
    	return result;
    }

    public boolean load( int idz, Connection c ) {
    	boolean retVal = false;    	
    	PreparedStatement pstmt = null;
        ResultSet rs = null;
        String sqlQuery = "SELECT * FROM " + tabName + " WHERE "+ idField + " = ?";
        
        try {
        	c.setAutoCommit(false);
        	pstmt = c.prepareStatement(sqlQuery);
        	pstmt.setInt(1, idz  );
	        rs = pstmt.executeQuery();
	        
	        if ( rs.next() ) {
	        	this.set(rs);
	        	retVal =  true;
	        	
	        } else {
	        	//errore, non c'era il record sul db
	        	System.out.println("La Persona con id " + this.id + " non e' presente sul database.");
	        	retVal = false;
	        }
	        
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try{
                if( rs != null )
                    rs.close();
                if( pstmt != null )
                    pstmt.close();
            } catch(Exception e){
                System.out.println(" Rilascio risorse non riuscito: "+e.getMessage());
            }
        }
        
        return retVal;
    }
    
    public void set ( Persona p ) {
    	this.id = p.id;
    	this.nome = p.nome;
    	this.cognome = p.cognome;
    	this.dataNascita = p.dataNascita;
    	this.luogoNascita = p.luogoNascita;
    	this.biografia = p.biografia;
    	this.awards = p.awards;
    	
    	return;
        
    }

    //Questo metodo viene solitamente usato per settare i parametri di un oggetto compilato da form
    private void set ( ResultSet rs ) throws SQLException {
    	this.id = rs.getInt( idField );
    	this.nome = rs.getString( nomeField );
    	this.cognome = rs.getString( cognomeField );
    	this.dataNascita = rs.getDate( dataNascitaField );
    	this.luogoNascita = rs.getString( luogoNascitaField );
    	this.biografia = rs.getString( biografiaField );
    	this.awards = rs.getString( awardsField );
    	
    	return;
        
    }
    
    public Result save( Connection c ) {
    	return save(c, true);
    }

    public Result save( Connection c, boolean validate ) {
        // salva l'oggetto nel db.
        // Se e' un nuovo record dopo il salvataggio setta this.id
        // Ritorna se ci sono stati errori o meno nel salvataggio
    	
    	Result result = null;
    	
    	String query = "";
    	PreparedStatement pstmt = null;
    	ResultSet rs = null;
    	int rowInserted;
    	
    	if ( validate ) {
    		result = validate();
    		if ( !result.result )
    			return result;
    	}
    	
    	
    	try {
    		
    		c.setAutoCommit(false);
    		
    		
	    	if ( this.id < 1 ) { //non e' un nuovo record
	    		query = "INSERT INTO "+ tabName +" ( " + nomeField + ", " + cognomeField + ", " + dataNascitaField + ", " + luogoNascitaField + ", " + biografiaField + ", " + awardsField  + "  ) VALUES (?,?,?,?,?,?)";
	    		pstmt = c.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
	    	} else {
	    		c.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
	    		query = "UPDATE "+ tabName +" SET " + nomeField + " = ?, " + cognomeField + " = ?, " + dataNascitaField + " = ?, " + luogoNascitaField + " = ?, " + biografiaField + " = ?, " + awardsField + " = ? WHERE " + idField + " = ?";
	    		pstmt = c.prepareStatement(query);
	    	}
	    	
	    	
	    	pstmt.setString(1, this.nome  );
	    	pstmt.setString(2, this.cognome  );
	    	pstmt.setDate(3, this.dataNascita  );
	    	pstmt.setString(4, this.luogoNascita  );
	    	pstmt.setString(5, this.biografia  );
	    	pstmt.setString(6, this.awards  );
	    	
	    	if ( this.id > 0 )
	    		pstmt.setInt(7, this.id  );
	    	
	    	rowInserted = pstmt.executeUpdate();
	    	if ( rowInserted > 0 ) {
	    		result = new Result ( true, this, "Record inserito con successo per la persona  " + this.nome + " " + this.cognome );
	    	} else {
	    		result = new Result ( false, null, "Record non inserito per la persona " + this.nome + " " + this.cognome );
	    	}    	
	    	
	    	//Aggiorno l'id del film - problema, mi sa sempre rs.next() false
	    	if ( this.id < 1 ) {
		    	rs = pstmt.getGeneratedKeys(); 
		    	if ( rs != null && rs.next() ) 
		    	    this.id = rs.getInt(1); 
		    	rs.close();	
	    	}
	    	
	    	
	        pstmt.close();
	    	c.commit();
	    	
	    	c.setAutoCommit(true);
	    	
	    	
	    	
    	} catch(Exception e){
            System.out.println( "Errore generale: " +e.getMessage());
            result = new Result ( false, null, "Errore generale: " +e.getMessage() + "\nRecord non inserito per la persona con ID " + this.id );
            //e.printStackTrace();
            // rollback
            try{
            	System.out.println("Rollback, annullo modifiche al database");
                c.rollback();
            } catch(Exception eRollback){}
        
        } finally {
            try{
                if( rs != null )
                    rs.close();
                if( pstmt != null )
                    pstmt.close();
            } catch(Exception e){
            	result = new Result ( false, null, "Rilascio risorse non riuscito: "+e.getMessage() + "\nRecord non inserito per la persona con ID " + this.id  );
                System.out.println(" Rilascio risorse non riuscito: "+e.getMessage());
            }
        }
    	
        return result;
    }

    public Result delete( Connection c ) {
    	// cancellala dal db
    	String query = "";
    	int affectedRows = 0;
    	Result result = null;
    	PreparedStatement pstmt = null;
    	
    	try {
    		c.setAutoCommit(false);
    		query = "DELETE FROM " + tabName + " WHERE " + idField + " = ?";
    		pstmt = c.prepareStatement(query);
    		pstmt.setInt(1, this.id);
    		
    		affectedRows = pstmt.executeUpdate();
    		if ( affectedRows > 0 ) {
    			result = new Result ( true, null, "Record cancellato con persona ID " + this.id );
	    	} else {
	    		result = new Result ( false, null, "Record NON cancellato con persona ID " + this.id );
	    	}
    			
    		
    		pstmt.close();
    		c.commit();

    		
    	} catch(Exception e){
    		if ( Test.DEBUG ) System.out.println( "Errore generale: " +e.getMessage());
            result = new Result ( false, null, "Errore generale: " +e.getMessage() + "\nRecord non cancellato con persona ID " + this.id );
            // rollback
            try{
            	if ( Test.DEBUG ) System.out.println("Rollback, annullo modifiche al database");
                c.rollback();
            } catch(Exception eRollback){}
        
        } finally {
            try{
                if( pstmt != null )
                    pstmt.close();
            } catch(Exception e){
            	result = new Result ( false, null, "Rilascio risorse non riuscito: " +e.getMessage() + "\nRecord non cancellato con persona ID " + this.id );
                if ( Test.DEBUG ) System.out.println("Rilascio risorse non riuscito: "+e.getMessage());
            }
        }
        
        return result;
    }

    public String toString() {
    	/* da fare per ogni field che stampo */
    	String d = this.dataNascita == null ? "Non presente" : this.dataNascita.toString();
    	
        return "["+this.id+"]" + this.nome + " " + this.cognome+", "+d;
    }
    
}

